package com.sxj.corejava.code08_常用类.String类;

import jdk.swing.interop.SwingInterOpUtils;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2025年01月10日
 */
public class Test05_字符集 {

    public static void main(String[] args) throws UnsupportedEncodingException {
//        showEncoding();
//        encoded();
//        decoded();
//        garbled();
        garbled2();
    }

    /**
     * 查看字符集
     */
    public static void showEncoding() {
        // 查看当前系统所使用的字符串
        System.out.println(System.getProperty("file.encoding"));
        // JVM默认使用的字符集
        System.out.println(Charset.defaultCharset());
    }

    /**
     * 编码:将指定的数据转换成底层二进制数据
     * 即:字符串 -> 字节数组
     */
    public static void encoded() throws UnsupportedEncodingException {
        String s = "你好";
        // 使用默认字符集进行转换
        byte[] bs = s.getBytes();
        // 此时的结果是6个字节,即:一个中文3个字节
        System.out.println(Arrays.toString(bs));

        // 使用指定字符集进行转换
        byte[] bs2 = s.getBytes("GBK");
        // 此时的结果是4个字节,即:一个中文2个字节
        System.out.println(Arrays.toString(bs2));
    }

    public static void decoded() throws UnsupportedEncodingException {
        // UTF-8
        byte[] bs = {-28, -67, -96, -27, -91, -67};
        // 使用默认字符集将指定字节数组转换成字符串
        String s = new String(bs);
        System.out.println(s);


        // GBK
        byte[] bs2 = {-60, -29, -70, -61};
        // 使用指定字符集将字节数组转换成字符串
        String s2 = new String(bs2, "GBK");
        System.out.println(s2);
    }

    /**
     * 乱码场景一:可以解决乱码的问题
     * @throws UnsupportedEncodingException
     */
    public static void garbled() throws UnsupportedEncodingException {
        String s = "你好";
        // 编码 --> 使用GBK编码
        byte[] bs = s.getBytes("GBK");
        System.out.println(Arrays.toString(bs));
        // 解码 --> 使用ISO-8859-1解码
        String s2 = new String(bs, "ISO-8859-1");
        // 由于编码与解码所采用的字符集不一致,因此产生了乱码
        System.out.println(s2);

        // 假设场景:目前只知道最后乱码的数据以及之前编码与解码所采用的字符集是什么,如何解决乱码?
        // 1.使用之前解码的字符集重新编码
        byte[] bs2 = s2.getBytes("ISO-8859-1");
        System.out.println(Arrays.toString(bs2));
        // 2.使用之前编码的字符集重新解码
        String s3 = new String(bs2, "GBK");
        System.out.println(s3);

        // 简写方式
        String s4 = new String(s2.getBytes("ISO-8859-1"), "GBK");
        System.out.println(s4);
    }

    /**
     * 乱码场景二:无法解决乱码问题
     * 例如:GBK不符合UTF-8的规则
     * @throws UnsupportedEncodingException
     */
    public static void garbled2() throws UnsupportedEncodingException {
        String s = "你好";
        // 编码 --> GBK
        byte[] bs = s.getBytes("GBK");
        System.out.println(Arrays.toString(bs));
        // 解码 --> UTF-8
        String s2 = new String(bs, "UTF-8");
        System.out.println(s2);

        // 解决乱码
        String s3 = new String(s2.getBytes("UTF-8"), "GBK");
        System.out.println(s3);
    }

}
